package com.test.util;

import java.util.Collection;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.apache.commons.logging.LogFactory;

import org.apache.commons.logging.Log;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.test.domain.Priviledge;
import com.test.service.PriviledgeService;



/**
 * 由于左侧菜单栏是要根据角色权限来给予显示的，所以为了避免每次都去查询数据库，这里通过监听器，在初始化时<br>
 * 便将菜单栏信息查询出来，并放到内存中（数据不是特别多）.
 * @author Administrator
 *
 */
public class InitMenuBar implements ServletContextListener{
	private Log log = LogFactory.getLog(InitMenuBar.class);
	//初始化
	public void contextInitialized(ServletContextEvent sce) {
		//因为采用了监听器，即使采用了注解，虽然本实例能放到容器中，且容器中也能拿到service，但是在监听器中
		//会通过类全名，再使用反射来创建实例，所以最终用的不是容器中的那个InitMenuBar实例。
		ServletContext application = sce.getServletContext();
		//从Spring的容器中取出PriviledgeService对象实例
		//1.从Spring的监听器中创建Spring容器对象
		ApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(application);
		PriviledgeService priviledgeService = (PriviledgeService)ac.getBean("priviledgeService");
		//查询所有顶级权限列表并放到application作用域中，这样所有用户都可以访问
		List<Priviledge> topPriviledgeList  = priviledgeService.findTopList();
		application.setAttribute("topPriviledgeList", topPriviledgeList);
		log.info("===顶级的权限列表topPriviledgeList已经放到application作用域中===");
		//查询出所有权限url列表并放到application作用域中。
		Collection<String> allPriviledgeUrls = priviledgeService.findAllPriviledgeUrls();
		application.setAttribute("allPriviledgeUrls", allPriviledgeUrls);
		log.info("===所有权限地址列表allPriviledgeUrls已经放到application作用域中===");
	}
	//销毁
	public void contextDestroyed(ServletContextEvent sce) {
		// TODO Auto-generated method stub
		
	}

}
